EDA#

# Librerias
import warnings
warnings.filterwarnings('ignore')

import pandas as pd
import os
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Definir la paleta de colores personalizada
custom_colors = ['#1F3040', '#B9CDCA', '#F2C6AC', '#D99982', '#735749']

Importar datos#

ventas = pd.read_csv('C:/UNINORTE/VC/Proyecto2/Archivos_Finales/datosventas.csv')
columnasenteras = ['rooms', 'baths', 'park', 'Estrato']
for columna in columnasenteras:
    ventas[columna] = ventas[columna].astype(int)
# Mostrar las primeras filas del DataFrame
ventas.head()
lat long category price rooms baths park ciudad barrio area_privada area_const admon Estrato Estado Antiguedad Piso No Tipo de Apartamento Sector
0 3.377575 -76.523969 Apartamento 197000000.0 2 2 1 Cali Ciudad Bochalema 64.0 64.0 178000.000000 4 No Especificado 1 a 8 años NaN No Especificado Ciudad Bochalema
1 4.563951 -74.107534 Apartaestudio 70000000.0 1 1 0 Bogotá Las Lomas 30.0 30.0 45000.000000 2 No Especificado 16 a 30 años NaN No Especificado Las Lomas
2 6.264103 -75.603076 Apartamento 235000000.0 3 2 1 Medellín Calasanz Occidente 56.0 56.0 192139.000000 3 No Especificado No Especificado 13.0 No Especificado No Especificado
3 10.993099 -74.817276 Apartaestudio 139000000.0 1 1 1 Barranquilla Ciudad Jardín 43.0 43.0 145000.000000 4 No Especificado No Especificado 4.0 No Especificado No Especificado
4 6.248413 -75.563910 Apartamento 260000000.0 4 2 0 Medellín Centro 115.0 115.0 177878.235981 4 4.0 9 a 15 años 3.0 No Especificado Centro
# Obtener información general del DataFrame
print(ventas.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 155105 entries, 0 to 155104
Data columns (total 18 columns):
 #   Column               Non-Null Count   Dtype  
---  ------               --------------   -----  
 0   lat                  155105 non-null  float64
 1   long                 155105 non-null  float64
 2   category             155105 non-null  object 
 3   price                155105 non-null  float64
 4   rooms                155105 non-null  int32  
 5   baths                155105 non-null  int32  
 6   park                 155105 non-null  int32  
 7   ciudad               155105 non-null  object 
 8   barrio               155105 non-null  object 
 9   area_privada         155105 non-null  float64
 10  area_const           155105 non-null  float64
 11  admon                155105 non-null  float64
 12  Estrato              155105 non-null  int32  
 13  Estado               155105 non-null  object 
 14  Antiguedad           155105 non-null  object 
 15  Piso No              112509 non-null  float64
 16  Tipo de Apartamento  155105 non-null  object 
 17  Sector               155105 non-null  object 
dtypes: float64(7), int32(4), object(7)
memory usage: 18.9+ MB
None
# Descripción estadística de las variables numéricas
ventas.describe().T
count mean std min 25% 50% 75% max
lat 155105.0 5.652091e+00 2.204566e+00 3.254000e+00 4.648077e+00 4.721532e+00 6.210060e+00 1.104366e+01
long 155105.0 -7.487562e+01 8.883420e-01 -7.657500e+01 -7.557198e+01 -7.420027e+01 -7.406731e+01 -7.396190e+01
price 155105.0 4.984872e+08 4.051956e+08 2.000000e+06 2.400000e+08 3.750000e+08 6.000000e+08 4.900000e+09
rooms 155105.0 3.003527e+00 1.033709e+00 1.000000e+00 2.000000e+00 3.000000e+00 3.000000e+00 7.000000e+00
baths 155105.0 2.559737e+00 1.121071e+00 0.000000e+00 2.000000e+00 2.000000e+00 3.000000e+00 7.000000e+00
park 155105.0 1.182457e+00 9.385399e-01 0.000000e+00 1.000000e+00 1.000000e+00 2.000000e+00 5.000000e+00
area_privada 155105.0 1.114881e+02 6.199171e+01 1.000000e+00 6.500000e+01 9.400000e+01 1.390000e+02 3.250000e+02
area_const 155105.0 1.139092e+02 6.337710e+01 1.000000e+00 6.600000e+01 9.600000e+01 1.440000e+02 3.319651e+02
admon 155105.0 3.498544e+05 2.571560e+05 0.000000e+00 1.600000e+05 2.840000e+05 4.790000e+05 2.118338e+06
Estrato 155105.0 4.101970e+00 9.879393e-01 1.000000e+00 3.000000e+00 4.000000e+00 5.000000e+00 6.000000e+00
Piso No 112509.0 3.753531e+00 3.098129e+00 1.000000e+00 1.000000e+00 3.000000e+00 5.000000e+00 1.600000e+01
# Verificar valores nulos
print(ventas.isnull().sum())
lat                        0
long                       0
category                   0
price                      0
rooms                      0
baths                      0
park                       0
ciudad                     0
barrio                     0
area_privada               0
area_const                 0
admon                      0
Estrato                    0
Estado                     0
Antiguedad                 0
Piso No                42596
Tipo de Apartamento        0
Sector                     0
dtype: int64
# Seleccionar columnas numericas
columnas_numericas = ventas.select_dtypes(include=['int', 'float']).columns

# Guardar los nombres de las columnas numericas en una lista
nombre_columna_numericas = list(columnas_numericas )
# Seleccionar columnas categóricas
columnas_categoricas = ventas.select_dtypes(include=['object', 'category']).columns

# Guardar los nombres de las columnas categóricas en una lista
nombre_columna_categorica = list(columnas_categoricas)

Histograma de precio por ciudad y estrato#

# Histograma de price por estrato

fig = px.histogram(ventas, x='price', color='Estrato',
                   barmode='overlay',
                   title='Histograma de precio por estrato', 
                   labels={'price': 'Precio'},
                   opacity=0.75,
                   color_discrete_sequence=custom_colors)  

# Personalizar el gráfico
fig.update_layout(xaxis_title='Precio', yaxis_title='Frecuencia')
fig.update_traces(marker_line_width=1.5, marker_line_color='black')

# Mostrar el gráfico
fig.show()
# Histograma de price por ciudad

fig = px.histogram(ventas, x='price', color='ciudad',
                   barmode='overlay',
                   title='Histograma de precio por ciudad', 
                   labels={'price': 'Precio'},
                   opacity=0.75,
                   color_discrete_sequence=custom_colors)  

# Personalizar el gráfico
fig.update_layout(xaxis_title='Precio', yaxis_title='Frecuencia')
fig.update_traces(marker_line_width=1.5, marker_line_color='black')

# Mostrar el gráfico
fig.show()

Histograma de cada columna en contraste con el precio#

# Definir las columnas para las que quieres generar el gráfico
columns = ['area_privada', 'area_const', 'admon','rooms', 'baths', 'park']

# Iterar sobre cada columna para crear un gráfico
for col in columns:
    # Crear subplot con dos ejes y-y
    fig = make_subplots(specs=[[{"secondary_y": True}]])

    # Agregar el histograma para la columna actual
    fig.add_trace(
        go.Histogram(x=ventas[col], name=col, marker_color=custom_colors[0]),
        secondary_y=False,
    )

    # Calcular el precio promedio para cada bin de la columna actual
    bins = pd.cut(ventas[col], 20)
    grouped = ventas.groupby(bins)['price'].mean().reset_index()
    # Usar el punto medio de cada intervalo como coordenada x para la línea
    grouped['mid'] = grouped[col].apply(lambda x: x.mid)

    # Agregar la línea de precio promedio
    fig.add_trace(
        go.Scatter(x=grouped['mid'], y=grouped['price'], name=f'Precio Promedio {col}', mode='lines+markers', line=dict(color=custom_colors[4])),
        secondary_y=True,
    )

    # Actualizar el layout del gráfico
    fig.update_layout(
        title_text=f'Histograma y Precio Promedio de {col}',
        xaxis_title=col,
        yaxis_title='Frecuencia',
        legend_title='Variable',
    )

    # Configurar el eje y secundario para el precio promedio
    fig.update_yaxes(title_text='Precio Promedio', secondary_y=True)

    # Mostrar el gráfico
    fig.show()